When the same code is duplicated in two or more separate branches of a conditional, it can make the code harder to understand, maintain, and can
potentially introduce bugs if one instance of the code is changed but others are not.
Having two branches in the same if
structure with the same implementation is at best duplicate code, and at worst a coding error.
if 0 <= a < 10:
do_first()
do_second()
elif 10 <= a < 20:
do_the_other_thing()
elif 20 <= a < 50:
do_first() # Noncompliant; duplicates first condition
do_second()
If the same logic is needed for both instances, then the conditions should be combined.
if (0 <= a < 10) or (20 <= a < 50):
do_first()
do_second()
elif 10 <= a < 20:
do_the_other_thing()
Exceptions
Blocks in an if
chain that contain a single line of code are ignored.
if 0 <= a < 10:
do_first()
elif 10 <= a < 20:
do_the_other_thing()
elif 20 <= a < 50:
do_first() # no issue, usually this is done on purpose to increase the readability
But this exception does not apply to if
chains without else
-s when all branches have the same single line of code. In the
case of if
chains with else
-s rule S3923 raises a bug.
if 0 <= a < 10:
do_first()
elif 20 <= a < 50:
do_first() # Noncompliant, this might have been done on purpose but probably not